package com.itheima.d7_thread_pool;

import java.util.List;
import java.util.concurrent.*;

/**
 * 目标：掌握线程池的创建
 *   |---线程池执行Runnable任务执行
 */
public class ThreadPoolTest1 {
    public static void main(String[] args) {
        // 1、通过ThreadPoolExecutor创建一个线程池对象参考
        ExecutorService pool = new ThreadPoolExecutor(
                3, //核心线程数
                5, //最大线程数
                8, //存活时间
                TimeUnit.SECONDS, //时间单位
                new ArrayBlockingQueue<>(4), //队列
                Executors.defaultThreadFactory(), //线程工厂
//                new ThreadPoolExecutor.CallerRunsPolicy() //拒绝策略   让调用线程去处理（main）
//                new ThreadPoolExecutor.AbortPolicy() //拒绝任务并抛出异常
//                new ThreadPoolExecutor.DiscardPolicy() //拒绝任务
                new ThreadPoolExecutor.DiscardOldestPolicy() //把等待最久的任务移除，把当前任务插入队列
        );



        //提交10个任务
        for (int i = 0; i < 10; i++) {
            /*//提交Runnable任务
            pool.execute(()->{
                String name = Thread.currentThread().getName();
                System.out.println(name + " : Hello 线程池～");

                //如果父类型异常没有抛出，子类型也不能抛出异常，只能处理
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });*/

            pool.execute(new MyRunnable("小兮" + i));
        }


        //关闭线程池
        //通常线程池开启后，是不会关闭的。除非确定后续不会再使用
//        pool.shutdown(); //把队列中的任务执行完，然后再结束
        List<Runnable> runnables = pool.shutdownNow(); //立刻关闭线程池，停止正在执行的任务，并返回队列中未执行的任务
        runnables.forEach(System.out::println);

    }
}

class MyRunnable implements Runnable {
    private String name;

    public MyRunnable(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println("任务执行");
    }
}
